
/* -----------------
* brief 
* 1. this is code gen by tools
*/

package service

import (
	"errors"
	"fmt"
	"saas_sys_base/common"
	. "saas_sys_base/modules/config/models"
	"saas_sys_base/sysconfig"
)


type AppConfigService struct {
	// add your model here
	appConfigModel AppConfigModel
	configService ConfigService
}

func init() {

}
//自定义函数

//从默认配置里面读取配置
func (t* AppConfigService) GetConfigByWho(who common.Who) (*common.AppConfig, error) {
	appwho := who.ToMiniApp()  //只留下app id

	/*if who.IsSys() { //补一脚，appconfig模块加入读取sys who的config功能，没想好这样补一脚是否优雅
		sysConfig := t.GetSysConfig()
		if sysConfig == nil {
			return nil, errors.New("sysconfig is nil")
		}
		return  sysConfig, nil
	}*/

	var appconfig *common.AppConfig
	for {
		//先看数据库中有没有对应的配置，再去文件中找配置内容
		config := t.configService.tbConfig.RecodeByWho(appwho)
		if config != nil {
			// config.ConfigData // TODO 暂时不会把配置存数据库，以后存了之后再进行转换
			break
		}

		// TO DO 如果权限小于配置文件权限级别，则不能使用配置

		appconfig = t.appConfigModel.RecodeByWho(appwho)
		if appconfig == nil {
			return nil, errors.New("no appconfig")
		}

		break
	}


	/*TO DO 以后增加配置文件继承功能；
	目前先简化为，子级app共享使用父级app的配置，也就是子级app没有配置文件，只使用父级app配置文件；
	后续预想增加app配置文件继承功能，
	大概是，
	如果子级app的配置字段为空，则使用父级别的配置字段值，
	如果子级app的配置字段为非空，则使用子级本身的配置字段值
	 */
	var parentConfig *common.AppConfig = appconfig
	var err error
	for appconfig.Parent_Mini_App_Id != 0 {
		parentAppWho := appwho
		parentAppWho.MiniAppId = appconfig.Parent_Mini_App_Id
		parentConfig, err = t.GetConfigByWho(parentAppWho)
		if err != nil {
			return nil, err
		}
	}

	appconfig.App_Config_Data = parentConfig.App_Config_Data   //TODO:以后这个逻辑要移到mode层
	return appconfig, nil

	/*if appconfig.Parent_Mini_App_Id != 0 { //TODO 这种写法意味着，不支持3级app，仅支持2级app
		parentAppWho := appwho
		parentAppWho.MiniAppId = appconfig.Parent_Mini_App_Id
		parentConfig, err := t.GetConfigByWho(parentAppWho)
		if err != nil {
			return nil, err
		}

		appconfig.App_Config_Data = parentConfig.App_Config_Data   //TODO:以后这个逻辑要移到mode层
		return appconfig, nil
	}

	return appconfig, nil*/
}


//从默认配置里面读取配置
func (t* AppConfigService) getConfigByWho(who common.Who) (*common.AppConfig, error) {
	config := t.appConfigModel.RecodeByWho(who)
	if config == nil {
		return nil, errors.New(fmt.Sprintf("no config for app %d", who.MiniAppId))
	}

	if config != nil {
		return config, nil
	}

	// to do 如果权限小于配置文件权限级别，则不能使用配置

	return config, nil
}

func (t* AppConfigService) GetAllAppConfig() ([]*common.AppConfig) {
	list := t.appConfigModel.ListAll()

	// to do 如果权限小于配置文件权限级别，则不能使用配置


	return list
}

//读取sys config并转化为app config结构（格式）
func (t* AppConfigService) GetSysConfig() (*common.AppConfig) {
	appconfig := new(common.AppConfig)

	appconfig.Who.Tenant_Id = 0
	appconfig.Who.Mini_App_Id = 0
	appconfig.Who.Uid = 0

	appconfig.APPName = sysconfig.Config.APPName
	appconfig.App_Config_Data = sysconfig.Config.App_Config_Data

	// to do 如果权限小于配置文件权限级别，则不能使用配置


	return appconfig
}

func (t* AppConfigService) ToUserMiniApp (who *common.Who) *common.Who {
	appconfig, err := t.GetConfigByWho(*who)
	if err != nil {
		panic("can not convert to UserMiniApp")
		return nil
	}

	if appconfig.App_Config_Data.Attr.Is_TenantApp != true{
		panic("can not convert to UserMiniApp, not Tenant app")
	}

	userMiniAppId := appconfig.App_Config_Data.Attr.User_Mini_App_Id
	if userMiniAppId == 0 {
		panic("can not convert to UserMiniApp, userMiniAppId not set")
	}
	userMiniAppWho := common.NewWho(who.TenantId, userMiniAppId, who.Uid)
	return userMiniAppWho
}